package com.njtech.pet.service.impl;

import com.njtech.pet.constant.Constant;
import com.njtech.pet.dao.*;
import com.njtech.pet.entity.*;
import com.njtech.pet.service.ActionService;
import com.njtech.pet.service.CreditService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;


/**
 * Created by m1870 on 2020/3/19.
 */
@Service("creditService")
public class CreditServiceImpl implements CreditService{

    @Autowired
    @Resource(name = "billDao")
    private BillDao billDao;
    @Resource(name = "userDao")
    private UserDao userDao;
    @Resource(name = "itemDao")
    private ItemDao itemDao;
    @Resource(name = "messageDao")
    private MessageDao messageDao;
    @Resource(name = "actionDao")
    private ActionDao actionDao;

    @Autowired
    @Lazy(value = true)
    private ActionService actionService;



    /**
     *获得用户总积分
     * @param uid 用户id
     * @return 返回总积分
     */
    @Override
    public Integer getUserCredit(Integer uid) {

       User user=userDao.selectByUserId(uid);

        Integer totalCredit =user.getCredit();

        return totalCredit;
    }

    /**
     * 查询积分详情
     * @param user 需要查询积分详情的用户
     * @return 积分list
     */
    @Override
    public List<Bill> getUserCreditHistory(User user) {


        //商品结算已支付
        List <Bill> list=billDao.selectByUser(user,Constant.Bill.STATE_BILL_PAID.getValue(),
                          Constant.Bill.TYPE_INSURANCE.getValue(),null,null);
        //每日签到
        List<Bill> list1=billDao.selectByUser(user,null,
                Constant.Bill.TYPE_FIRST_SIGN_IN.getValue(),null,null);
        //每日分享
        List<Bill> list2=billDao.selectByUser(user,null,
                Constant.Bill.TYPE_SHARE.getValue(),null,null);
        //优惠券
        List<Bill> list3=billDao.selectByUser(user, null,
                Constant.Bill.TYPE_COUPON.getValue(), null, null);
        //管理员修改
        List<Bill> list4=billDao.selectByUser(user, null,
                Constant.Bill.TYPE_EDIT.getValue(), null, null);
        //充值会员
        List<Bill> list5=billDao.selectByUser(user, null,
                Constant.Bill.TYPE_TOPUPMEMBER.getValue(), null, null);
        //使用优惠券
        List<Bill> list6=billDao.selectByUser(user,null,
                Constant.Bill.TYPE_USE_COUPON.getValue(),null,null);
        //商品结算已退款
        List <Bill> list7=billDao.selectByUser(user,Constant.Bill.STATE_BILL_REFUND.getValue(),
                Constant.Bill.TYPE_INSURANCE.getValue(),null,null);
        list.addAll(list1);
        list.addAll(list2);
        list.addAll(list3);
        list.addAll(list4);
        list.addAll(list5);
        list.addAll(list6);
        list.addAll(list7);

//        List<Bill>  list2=new ArrayList<Bill>();
//        //把追加到一起的list循环放入set集合中  
//         Set<Bill> set=new HashSet<Bill>();
//         for (int i = 0; i < list.size(); i++) {
//            Bill str=list.get(i);
//             set.add(str);
//             }
//       //把set集合遍历添加在list中  
//      for (Iterator<Bill> it = set.iterator(); it.hasNext();){
//           list2.add(it.next());
//         }

        System.out.println(list);
        return list;

    }


    /**
     * 退款时更改订单状态更新用户积分
     * @param bill 做出改变的bill
     * @param user 退款的用户
     * @return 用户总积分
     */

    @Override
    public Integer updateUserCredit(Bill bill ,User user) {

        //判断订单类型是不是已退款
        if (Objects.equals(Constant.Bill.STATE_BILL_REFUND.getValue(), bill.getState())){

            int uid =user.getId();
            //订单积分
            Integer billCredit=bill.getCredit();
            //更新用户积分
            userDao.updateUserCredit(uid ,-1* billCredit);
            //订单的积分状态改为负
            bill.setCredit(-1*billCredit);
            billDao.updateByBillId(bill);
            //用户总积分
            Integer totalCredit=user.getCredit();

            return totalCredit;

        }
        else{
        return null;
        }

    }

    /**
     * 购买完成添加积分
     * @param bill 进行操作的bill
     * @param user 进行购买的用户
     * @return 用户积分
     */
    @Override
    public Integer addCredit(Bill bill, User user) {

        //判断订单类型是不是已支付
        if (Objects.equals(Constant.Bill.STATE_BILL_PAID.getValue(), bill.getState())){

            //更新用户积分
            userDao.updateUserCredit(user.getId(),bill.getCredit() );

            Integer totalCredit= user.getCredit() ;

            return totalCredit;

        }else{
        return null;
        }
    }




    /**
     * 分享复制商品链接(没有分享给好友)
     * @param user 用户
     * @param item 商品
     * @return 商品链接
     */
    @Override
    public String copyLinks(User user, Item item) {

        //生成展示商品详情页的url
        String  itemUrl="http://localhost/productDetail?id="+item.getId();

        boolean tmp = actionService.isTodayFirstShare(user.getId());

        //判断是不是第一次分享
        if (tmp) {

            Bill bill = new Bill(null,user,item,null,null,null,null,null,null,null,null,null,0.0,0,null,null,null);

            bill.setCreateDate(new Date());

            //修改订单类别为：分享链接奖励
            bill.setType(Constant.Bill.TYPE_SHARE.getValue());

            //记录分享积分
            bill.setCredit(Constant.Credit.SHARE_CREDIT.getValue());

            //说明
            bill.setRemark("分享产生积分");

            //设置订单类型为永久有效
            bill.setState(Constant.Bill.STATE_PERMANENT.getValue());

            //分享产生的积分值
            Integer altCredit=Constant.Credit.SHARE_CREDIT.getValue();

            //bill表单记录的添加
            billDao.insert(bill);

            //更新用户积分
            userDao.updateUserCredit(user.getId(),altCredit);

            //生成一条每日首分享的action数据
            Action action=new Action(null,user,item,bill,Constant.Action.ACTION_SHARE.getValue(),new Date(),
                    Constant.Action.STATE_VALID.getValue(),null,"share");

            //action表里数据添加
            actionDao.insert(action);
    }
        return itemUrl;
    }

    /**
     * 管理员添加积分
     * @param user 用户
     * @param inputCredit 输入的积分
     * @return 用户积分
     */
    @Override
    public Integer addByAdmin(User user, int inputCredit) {
        int uid=user.getId();

        //给用户添加积分
        userDao.updateUserCredit(uid,inputCredit);

        //生产新的订单
        Bill bill = new Bill(null,user,null,null,null,null,null,null,null,null,null,null,0.0,0,null,null,null);

       // bill.setItem(item);
        bill.setCreateDate(new Date());

        //修改订单类别为：管理员添加
        bill.setType(Constant.Bill.TYPE_ADD.getValue());

        //记录积分
        bill.setCredit(inputCredit);

        //说明
        bill.setRemark("管理员添加");

        //设置订单类型为已支付
        bill.setState(Constant.Bill.STATE_BILL_PAID.getValue());

        //bill表单记录的添加
        billDao.insert(bill);

        int credit= user.getCredit()+inputCredit;
        return credit;

    }




    /**
     * 管理员删除积分
     * @param user 用户
     * @param deleteCredit 删除的积分值
     * @return  用户积分
     */
    @Override
    public Integer deleteByAdmin(User user, int deleteCredit) {
        int uid=user.getId();

        //判断需要删除的积分与用户已有积分的大小（如果大于等于则执行删除，小于则设置积分为0）
        int totalCredit=user.getCredit();

        if(totalCredit>=deleteCredit) {
            //给用户删除积分
            userDao.updateUserCredit(uid, -1 * deleteCredit);

        }else {
            //设置用户积分为0
            user.setCredit(0);
            userDao.updateByUserId(user);
        }
        //生产新的订单
        Bill bill = new Bill(null,user,null,null,null,null,null,null,null,null,null,null,0.0,0,null,null,null);

        bill.setCreateDate(new Date());

        //修改订单类别为：管理员删除
        bill.setType(Constant.Bill.TYPE_DELETE.getValue());

        //记录积分
        bill.setCredit(-1*deleteCredit);

        //说明
        bill.setRemark("管理员删除");

        //设置订单类型为已支付
        bill.setState(Constant.Bill.STATE_BILL_PAID.getValue());

        //bill表单记录的添加
        billDao.insert(bill);
        int credit= user.getCredit()-deleteCredit;
        return credit;
    }

}
